/*******************************************************************************
* Copyright (c) 2000, 2015 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.dialogs.cpd;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.resource.JFaceResources;
import org.eclipse.jface.window.ToolTip;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Link;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.internal.ActionSetContributionItem;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.dialogs.cpd.CustomizePerspectiveDialog.ActionSet;
import org.eclipse.ui.internal.dialogs.cpd.CustomizePerspectiveDialog.DisplayItem;
import org.eclipse.ui.internal.dialogs.cpd.CustomizePerspectiveDialog.DynamicContributionItem;
import org.eclipse.ui.internal.dialogs.cpd.CustomizePerspectiveDialog.ShortcutItem;
import org.eclipse.ui.views.IViewDescriptor;
import org.eclipse.ui.wizards.IWizardDescriptor;
/**
* A tooltip which, given a model element, will display its icon (if there
* is one), name, and a description (if there is one).
*
* @since 3.5
*/
abstract class NameAndDescriptionToolTip extends ToolTip {
public NameAndDescriptionToolTip(Control control, int style) {
super(control, style, false);
}
protected abstract Object getModelElement(Event event);
/**
* Adds logic to only show a tooltip if a meaningful item is under the
* cursor.
*/
@Override
protected boolean shouldCreateToolTip(Event event) {
return super.shouldCreateToolTip(event)
&& getModelElement(event) != null;
}
@Override
protected Composite createToolTipContentArea(Event event,
Composite parent) {
Object modelElement = getModelElement(event);
Image iconImage = null;
String nameString = null;
if (modelElement instanceof DisplayItem) {
iconImage = ((DisplayItem) modelElement).getImage();
nameString = ((DisplayItem) modelElement).getLabel();
} else if (modelElement instanceof ActionSet) {
nameString = ((ActionSet) modelElement).descriptor.getLabel();
}
// Create the content area
Composite composite = new Composite(parent, SWT.NONE);
composite.setBackground(parent.getDisplay().getSystemColor(
SWT.COLOR_INFO_BACKGROUND));
composite.setLayout(new GridLayout(2, false));
// The title area with the icon (if there is one) and label.
Label title = createEntry(composite, iconImage, nameString);
title.setFont(getTitleFont());
GridDataFactory.createFrom((GridData)title.getLayoutData())
.hint(SWT.DEFAULT, SWT.DEFAULT)
.minSize(CustomizePerspectiveDialog.MIN_TOOLTIP_WIDTH, 1)
.applyTo(title);
// The description (if there is one)
String descriptionString = NameAndDescriptionToolTip.getDescription(modelElement);
if (descriptionString != null) {
createEntry(composite, null, descriptionString);
}
// Other Content to add
addContent(composite, modelElement);
return composite;
}
/**
* @return a font for titles in the tooltips
*/
Font getTitleFont() {
return JFaceResources.getFontRegistry().getBold(NameAndDescriptionToolTip.class.getName());
}
/**
* Adds a line of information to <code>parent</code>. If
* <code>icon</code> is not <code>null</code>, an icon is placed on the
* left, and then a label with <code>text</code>.
*
* @param parent
* the composite to add the entry to
* @param icon
* the icon to place next to the text. <code>null</code> for
* none.
* @param text
* the text to display
* @return the created label
*/
protected Label createEntry(Composite parent, Image icon, String text) {
Color fg = parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND);
Color bg = parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND);
if (icon != null) {
Label iconLabel = new Label(parent, SWT.NONE);
iconLabel.setImage(icon);
iconLabel.setForeground(fg);
iconLabel.setBackground(bg);
iconLabel.setData(new GridData());
}
Label textLabel = new Label(parent, SWT.WRAP);
if(icon == null) {
GridDataFactory.generate(textLabel, 2, 1);
} else {
GridDataFactory.generate(textLabel, 1, 1);
}
if (text != null) {
textLabel.setText(text);
}
textLabel.setForeground(fg);
textLabel.setBackground(bg);
return textLabel;
}
/**
* Adds a line of information to <code>parent</code>. If
* <code>icon</code> is not <code>null</code>, an icon is placed on the
* left, and then a label with <code>text</code>, which supports using
* anchor tags to creates links
*
* @param parent
* the composite to add the entry to
* @param icon
* the icon to place next to the text. <code>null</code> for
* none.
* @param text
* the text to display
* @return the created link
*/
protected Link createEntryWithLink(Composite parent, Image icon,
String text) {
Color fg = parent.getDisplay().getSystemColor(SWT.COLOR_INFO_FOREGROUND);
Color bg = parent.getDisplay().getSystemColor(SWT.COLOR_INFO_BACKGROUND);
if (icon != null) {
Label iconLabel = new Label(parent, SWT.NONE);
iconLabel.setImage(icon);
iconLabel.setForeground(fg);
iconLabel.setBackground(bg);
iconLabel.setData(new GridData());
}
Link textLink = new Link(parent, SWT.WRAP);
if(icon == null) {
GridDataFactory.generate(textLink, 2, 1);
}
textLink.setText(text);
textLink.setForeground(fg);
textLink.setBackground(bg);
return textLink;
}
/**
* @param destination
* @param modelElement
*/
protected void addContent(Composite destination, Object modelElement) {
}
static String getDescription(IContributionItem item) {
if (item instanceof ActionContributionItem) {
ActionContributionItem aci = (ActionContributionItem) item;
IAction action = aci.getAction();
if (action == null) {
return null;
}
return action.getDescription();
}
if (item instanceof ActionSetContributionItem) {
ActionSetContributionItem asci = (ActionSetContributionItem) item;
IContributionItem subitem = asci.getInnerItem();
return getDescription(subitem);
}
return null;
}
static String getDescription(Object object) {
if (object instanceof DisplayItem) {
DisplayItem item = (DisplayItem) object;
if (CustomizePerspectiveDialog.isNewWizard(item)) {
ShortcutItem shortcut = (ShortcutItem) item;
IWizardDescriptor descriptor = (IWizardDescriptor) shortcut
.getDescriptor();
return descriptor.getDescription();
}
if (CustomizePerspectiveDialog.isShowPerspective(item)) {
ShortcutItem shortcut = (ShortcutItem) item;
IPerspectiveDescriptor descriptor = (IPerspectiveDescriptor) shortcut
.getDescriptor();
return descriptor.getDescription();
}
if (CustomizePerspectiveDialog.isShowView(item)) {
ShortcutItem shortcut = (ShortcutItem) item;
IViewDescriptor descriptor = (IViewDescriptor) shortcut
.getDescriptor();
return descriptor.getDescription();
}
if (item instanceof DynamicContributionItem) {
return WorkbenchMessages.HideItems_dynamicItemDescription;
}
IContributionItem contrib = item.getIContributionItem();
return NameAndDescriptionToolTip.getDescription(contrib);
}
if (object instanceof ActionSet) {
ActionSet actionSet = (ActionSet) object;
return actionSet.descriptor.getDescription();
}
return null;
}
}